package ar.edu.utn.frba.disenio.aterrizar.aerolineas;

import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.disenio.aterrizar.aerolineas.AerolineaOceanic;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.AsientoDTO;
import ar.edu.utn.frba.disenio.aterrizar.busquedas.CriterioBusqueda;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.*;
import ar.edu.utn.frba.disenio.aterrizar.usuario.*;
import ar.edu.utn.frba.disenio.aterrizar.estrategia.*;

public class AdapterOceanic extends Aerolinea{
	
	protected AerolineaOceanic aerolinea;
	protected Usuario usuario;
	protected EstrategiaBusqueda estrategiaBusqueda;
	
	public AdapterOceanic(){
		this.aerolinea = AerolineaOceanic.getInstance();
		this.setRecargoAerolinea(1.18);
	}
	
	public AdapterOceanic(AerolineaOceanic mock){
		this.aerolinea = mock;
		this.setRecargoAerolinea(1.18);
	}
		
	
	@Override
	public ArrayList<Vuelo> asientosTotales(){
		
		ArrayList<Vuelo> retVal = new ArrayList<Vuelo>();
		List<AsientoDTO> disponibles = aerolinea.getAsientosDisponibles();
		for(AsientoDTO unAsiento : disponibles){
			String [] unVuelo = this.parsearAsientoDTOAVuelo(unAsiento);
			Vuelo otroVuelo = new Vuelo(unVuelo);
			retVal.add(otroVuelo);
			}
		return retVal;
	}
	
	@Override
	public ArrayList<Vuelo> buscarVuelos(CriterioBusqueda busqueda) {

		ArrayList<Vuelo> disponibles = estrategiaBusqueda.buscar(aerolinea, busqueda, this);
		return disponibles;
	}
	

	@Override
	public void comprarAsiento(String codigoAsiento, Usuario unUsuario) {
		String codigoVuelo = codigoAsiento.substring(0, 5);
		Integer numeroAsiento = Integer.parseInt(codigoAsiento.substring(6, 8));
		if(!aerolinea.comprarSiHayDisponibilidad(unUsuario.getDni(), codigoVuelo, numeroAsiento)){ 
			throw new AsientoNoDisponibleException();
		}
	}
	

	@Override
	public void reservar(String codigoAsiento, Usuario usuario){
		String [] parser = codigoAsiento.split("-"); 
		Integer asiento= Integer.parseInt(parser[1]);
		String codigoVuelo= parser[0];
		
		if(!(aerolinea.reservar(usuario.getDni(), codigoVuelo, asiento)))
			throw new AsientoNoDisponibleException(); 
	}
	
	@Override
	public Vuelo buscarVueloParticular(String codigo, Usuario usuario) {

		ArrayList<Vuelo> asientosTotales = this.asientosTotales();
		
		for(Vuelo unVuelo : asientosTotales){
			if(unVuelo.codigo.equals(codigo)){
				unVuelo.aplicarRecargo(this.recargoAerolinea, usuario.getRecargoUsuario());
				return unVuelo;				 
			}			
        }  
		throw new AsientoErroneoException();
	}
	
	public String[] parsearAsientoDTOAVuelo(AsientoDTO unAsiento){
		String fechaSalida = unAsiento.getFechaDeSalida();
		String fechaLlegada = unAsiento.getFechaDeLlegada();
		String horaSalida = unAsiento.getHoraDeSalida();
		String horaLlegada = unAsiento.getHoraDeLlegada();
		String precio = (unAsiento.getPrecio()).toString();
		String clase = unAsiento.getClase();
		String ubicacion = unAsiento.getUbicacion();
		String origen = unAsiento.getOrigen();
		String destino = unAsiento.getDestino();
		String codigoVuelo = unAsiento.getCodigoDeVuelo();
		String estado = "D";
		Boolean estadoPrevio = true;
		try{
			estadoPrevio = aerolinea.estaReservado(codigoVuelo, unAsiento.getNumeroDeAsiento());
		}catch (NullPointerException e){
			estado = "D";
		}
		if(estadoPrevio){
			estado = "R";
		}
		String numeroAsiento = Integer.toString(unAsiento.getNumeroDeAsiento());
		String codigo = codigoVuelo+"-"+numeroAsiento;
		String[] unVuelo = {codigo, precio, clase, ubicacion, estado, null, horaSalida, horaLlegada, origen, destino, fechaSalida, fechaLlegada};
		return unVuelo;
	}


	public void setEstrategiaBusqueda(EstrategiaBusqueda unaEstrategiaBusqueda){
		this.estrategiaBusqueda = unaEstrategiaBusqueda;
	}
}